
module(...,package.seeall)

--加载常用的全局函数至本地
local tinsert,ssub,sbyte,schar,sformat,slen = table.insert,string.sub,string.byte,string.char,string.format,string.len

--[[
函数名：split
功能  ：
参数  ：无
返回值：无
]]
function split(str, d) --str是需要查分的对象 d是分界符  
    local lst = { }  
    local n = string.len(str)--长度  
    local start = 1  
    while start <= n do  
        local i = string.find(str, d, start) -- find 'next' 0  
        if i == nil then   
            table.insert(lst, string.sub(str, start, n))  
            break   
        end  
        table.insert(lst, string.sub(str, start, i-1))  
        if i == n then  
            table.insert(lst, "")  
            break  
        end  
        start = i + 1  
    end  
    return lst  
end  

--[[
函数名：floatstr2intx10
功能  ：
参数  ：无
返回值：无
]]
function floatstr2intx10(var_str)
    local start_i, end_j = string.find(var_str,'%.')
    if start_i ~= nil then
        local filter_str = string.match(var_str, "%p*%d+.%d")
        if filter_str ~= nil then
            local tmp_str = string.gsub(filter_str, "%.", "")
            return tonumber(tmp_str)
        else
            print("floatstr2intx10 fail2")
        end
    else
        local n = tonumber(var_str)
        if n then
            return tonumber(var_str) * 10
        else
            print("floatstr2intx10 fail3")
        end
    end
end

--[[
函数名：floatcmp
功能  ：
参数  ：无
返回值：无
]]
function floatx10cmp(a, b)
        local intx10a;
        local intx10b;

        if type(a) == "string" then
                intx10a = floatstr2intx10(a)
        else
                intx10a = a
        end

        print("floatx10cmp:a="..intx10a);

        if type(b) == "string" then
                intx10b = floatstr2intx10(b)
        else
                intx10b = b
        end

        print("floatx10cmp:b="..intx10b);

        if intx10a > intx10b then
                print("a > b")
                return 1
        elseif intx10a < intx10b then
                print("a < b")
                return -1
        else
                print("a == b")
                return 0
        end
end
--[[
函数名：abs
功能  ：
参数  ：无
返回值：无
]]
function abs(x)
    if x >= 0 then
        return x
    else
        x = 0 - x
        return x
    end
end
 
function crc16modbus(msg)
  local crctab, res, tmp
 
  crctab = {
    0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
    0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
    0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
    0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
    0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
    0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
    0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
    0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
    0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
    0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
    0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
    0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
    0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
    0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
    0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
    0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
    0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
    0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
    0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
    0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
    0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
    0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
    0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
    0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
    0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
    0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
    0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
    0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
    0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
    0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
    0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
    0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
  }
  res = 0xFFFF
  for i = 1, #msg do
    tmp = msg:byte(i)
    tmp = bit.bxor(tmp, res)
    tmp = bit.band(tmp, 0xFF)
    res = bit.rshift(res, 8)
    res = bit.bxor(res, crctab[ tmp + 1 ])
  end
  local byteh = bit.rshift(res, 8)
  local byteh = bit.band(byteh, 0xFF)
  local bytel = bit.band(res, 0xFF)
  return bytel * 256 + byteh
end
 
 
 --[[
msg = string.char(0x55, 0x12, 0x34, 0x03, 0x01) -- 输入控制命令
crc = crc16modbus(msg)
byteh = bit.rshift(crc, 8)
byteh = bit.band(byteh, 0xFF)
bytel = bit.band(crc, 0xFF)
high = string.format('%02X', byteh)--高位
low = string.format('%02X', bytel)--低位
print(high)
print(low)
]]

--[[
函数名：binstohexs
功能  ：二进制数据 转化为 16进制字符串格式，例如91688121364265f7 （表示第1个字节是0x91，第2个字节为0x68，......） -> "91688121364265f7"
参数  ：
        bins：二进制数据
        s：转换后，每两个字节之间的分隔符，默认没有分隔符
返回值：转换后的字符串
]]
function binstohexs(bins,s)
    local hexs = "" 

    if bins == nil or type(bins) ~= "string" then return nil,"nil input string" end

    for i=1,slen(bins) do
        hexs = hexs .. sformat("%02X",sbyte(bins,i)) ..(s==nil and "" or s)
    end
    hexs = string.upper(hexs)
    return hexs
end

--[[
函数名：hexstobins
功能  ：16进制字符串 转化为 二进制数据格式，例如"91688121364265f7" -> 91688121364265f7 （表示第1个字节是0x91，第2个字节为0x68，......）
参数  ：
        hexs：16进制字符串
返回值：转换后的数据
]]
function hexstobins(hexs)
    local tbins = {}
    local num

    if hexs == nil or type(hexs) ~= "string" then return nil,"nil input string" end

    for i=1,slen(hexs),2 do
        num = tonumber(ssub(hexs,i,i+1),16)
        if num == nil then
            return nil,"error num index:" .. i .. ssub(hexs,i,i+1)
        end
        tinsert(tbins,num)
    end

    return schar(unpack(tbins))
end